/// 1. 函数指针
/// - 函数指针允许我们使用函数作为另一个函数的参数。
/// - 函数的类型是 fn ，fn 被称为 函数指针。指定参数为函数指针的语法类似于闭包。

fn add_one(x: i32) -> i32 {
    x + 1
}

fn do_twice(f: fn(i32) -> i32, arg: i32) -> i32 {
    f(arg) + f(arg)
}

/// 函数指针实现了Fn、FnMut、FnOnce这3个闭包
fn wap_fun<T> (t: T, value: i32) -> i32
where T: Fn(i32) -> i32 {
    t(value)
}

fn func(value: i32) -> i32 {
    value+1
}

fn main() {
    let a = wap_fun(|x| x+1, 1);
    println!("a is {}", a);

    let b = wap_fun(func, 1);
    println!("b is {}", b);

    let r = do_twice(add_one, 5);
    println!("r = {}", r);
    println!("Hello, world!");
}

